// src/utils/storage.ts
type StorageType = 'localStorage' | 'sessionStorage'

interface StorageItem<T> {
  value: T
  expiresAt?: number // 过期时间戳（毫秒）
}

class LocalStorage<T = any> {
  private storage: Storage

  constructor(type: StorageType) {
    this.storage = type === 'localStorage' ? window.localStorage : window.sessionStorage
  }

  /**
   * 存储数据（支持过期时间）
   * @param key 键名
   * @param value 值（任意类型）
   * @param ttl 过期时间（单位：毫秒），不传则永久存储
   */
  setItem<K extends keyof T>(key: K, value: T[K], ttl?: number): void {
    try {
      const item: StorageItem<T[K]> = {
        value,
        expiresAt: ttl ? Date.now() + ttl : undefined,
      }
      this.storage.setItem(key as string, JSON.stringify(item))
    } catch (error) {
      console.error(`[LocalStorage] Set item failed: ${error}`)
    }
  }

  /**
   * 获取数据（自动处理过期）
   * @param key 键名
   * @param defaultValue 默认值（可选）
   * @returns 存储的值或默认值
   */
  getItem<K extends keyof T>(key: K, defaultValue?: T[K]): T[K] | undefined {
    try {
      const itemStr = this.storage.getItem(key as string)
      if (!itemStr) return defaultValue

      const item: StorageItem<T[K]> = JSON.parse(itemStr)
      if (item.expiresAt && Date.now() > item.expiresAt) {
        this.removeItem(key) // 过期则删除
        return defaultValue
      }

      return item.value
    } catch (error) {
      console.error(`[LocalStorage] Get item failed: ${error}`)
      this.removeItem(key) // 解析失败则删除
      return defaultValue
    }
  }

  /**
   * 删除指定键
   * @param key 键名
   */
  removeItem<K extends keyof T>(key: K): void {
    this.storage.removeItem(key as string)
  }

  /**
   * 清空所有数据
   */
  clear(): void {
    this.storage.clear()
  }
}

// 导出实例（可按需选择 localStorage 或 sessionStorage）
export const localStorage = new LocalStorage('localStorage')
export const sessionStorage = new LocalStorage('sessionStorage')
